#!/usr/bin/env python
#coding:utf-8
"""
  Author:  程勇 --<>
  Purpose: 阶段考试
  Created: 2018/4/26
"""

import os

'''1. 列表list_1 = [[1,2,3,4,5],[{“name”:”张三”,”age”:28},{“name”:”James”:”age:30}]] ,获取James的年龄'''
def question_01():
    list_1 = [[1,2,3,4,5],[{"name":"张三","age":28},{"name":"James","age":30}]]
    print('james的年龄为:{}'.format(list_1[1][1]['age']))
    
'''2. 名词解释: 可迭代对象、迭代器、生成器、装饰器'''
def question_02():
    print('可迭代对象:可以使用for...in...循环语句迭代读取一条数据来使用的对象')
    print('迭代器：是一个带状态对象，调用next（）方法来获取容器的下一个值。迭代器中要有__iter__和__next__()方法')
    print('生成器：生成器一定是迭代器。但是不需要__iter__和__next__()方法。只需要yield关键字')
    print('装饰器：在不改变函数代码内容的前提下，来增加额外功能。也可以将一样功能的代码封装，供其他函数使用')
    
'''3. 名词解释：面向对象编程中“类”中有几种方法？分别解释各种方法的用途。'''
def question_03():
    print('有种方法')
    print('1.私有方法。访问权限，只能类内部使用')
    print('2.静态方法。不可以访问,通过传值的方式')
    print('3.类方法。可以通过cls访问类属性,获取类的信息')
    print('4.普通方法。可以通过self访问实例属性')

'''4. 输出以下代码运行结果，解释变量作用域LEGB.'''
def question_04():
    print('2 9 6\nfunc_inner 7 9')
    print('变量作用域:当前作用域局部变量(local)->外层作用域变量(enclosed)->当前模块中的全局变量(global)->python内置变量(built_in)')
    print('local:一个函数或者类方法内部使用，外部不能调用。如y=9')
    print('enclosed:外部嵌套函数的名字空间。')
    print('global:执行脚本自身的最高层次。x ,z')
    print('built_in:Python为自身保留的特殊名称。')
    
'''5. 解释什么是GIL(全局解释器锁)'''
def question_05():
    print('GIL:主要要在解释器的主循环中，同时只有一个线程在执行，即在任意时刻，只有一个线程在解释器中运行。对Python 虚拟机的访问由全局解释器锁（GIL）来控制，正是这个锁能保证同一时刻只有一个线程在运行。')
    print('''1. 设置GIL
             2. 切换到一个线程去运行
             3. 运行：
                  a. 指定数量的字节码指令，或者
                  b. 线程主动让出控制（可以调用time.sleep(0)）
             4. 把线程设置为睡眠状态
             5. 解锁GIL
             6. 再次重复以上所有步骤''')
    
'''6. 什么是线程、协程、进程'''
def question_06():
    print('''线程：有些进程还不止同时干一件事，比如Word，它可以同时进行打字、拼写检查、打印等事情。在一个进程内部，要同时干多件事，就需要同时运行多个“子任务”，我们把进程内的这些“子任务”称为线程（Thread）。
             线程是最小的执行单元，而进程由至少一个线程组成。
        ''')
    print('''进程：进程是分配资源的基本单位，也是我们说的隔离。线程作为独立运行和独立调度的基本单位
                  对于操作系统来说，一个任务就是一个进程（Process），比如打开一个浏览器就是启动一个浏览器进程，打开一个记事本就启动了一个记事本进程，打开两个记事本就启动了两个记事本进程，打开一个Word就启动了一个Word进程。
                我们可以认为线程是进程的一个执行流，独立执行它自己的程序代码。
          ''')
    print('''协程：协程是数据的消费者
                  协程极高的执行效率。因为子程序切换不是线程切换，而是由程序自身控制，因此，没有线程切换的开销，和多线程比，线程数量越多，协程的性能优势就越明显。
          ''')

'''7. 什么时候该用多线程、什么情况该用多进程'''
def question_07():
    print('使用多线程：IO密集型代码；使用多进程：CPU密集型代码')
    
'''8. 多个进程间如何通信？'''
def question_08():
    print('multiprocessing.Queue()队列。multiprocessing.Pipe()管道')